/*
    根据每个区间的左端点坐标对所有区间从左到右排序:
		1.在左起第一个区间A 的右端点 A.R 放置一个点，总放置点数加1
		2.若下一个区间B 的左端点 B.L > A.R, 
		    说明 区间A 与 区间B 无交集，此时在区间B 的右端点 B.R 放置一个点，总放置点数加1
		   否则说明 区间A 与 区间B 相交, 此时进一步判断，若 B.R < A.R，
			说明 区间B 在 区间A 的内部，此时把原本放置在 A.R 的点移动到 B.R（确保区间B有一个点），总放置点数不变
		3.重复这个过程直到所有区间被遍历完成
*/
#include<math.h>
#include<algorithm>
#include<iostream>

using namespace std;

struct interval{
    double l;   //左端点坐标
    double r;   //右端点坐标
};

int solve(interval* groupInterval,int island){
    sort(groupInterval,groupInterval+island,[](interval a,interval b){return a.l<=b.l;});//对区间集合按x大小排序
    int count=1;    //radar数量
    double right=groupInterval[0].r;

    for(int i=1;i<island;i++){
        if(groupInterval[i].l>right){   //后面的左边比前一个右边还大，前边这个雷达就可以定下了
            count++;
            right=groupInterval[i].r;
        }
        else if(groupInterval[i].r<right){  //后面的右边比前面的右边还小，这个radar覆盖不住后边的小岛范围
            right=groupInterval[i].r;
        }
        else{
            continue;
        }
    }
    return count;
}

int main(void){
    int island,radius=0;
    int num=1;
    while((cin>>island>>radius)&&island&&radius){
        double r2=radius*radius;
        interval* groupInterval=new interval[island];   //创建小岛数量匹配的结构体
        bool cansolved=true;    //标识是否可解
        for(int i=0;i<island;i++){
            double x,y;
            cin>>x>>y;
            if(y>radius){   //无解时
                cansolved=false;
            }
            double x_tmp=sqrt(r2-y*y);  //勾股定理计算距离偏差
            groupInterval[i].l=x-x_tmp;
            groupInterval[i].r=x+x_tmp;
        }
        int res=(cansolved?solve(groupInterval,island):-1);
        cout<<"Case "<<num++<<": "<<res<<endl;
        delete[] groupInterval;     //记得析构结构体数组
    }
    return 1;
}

